/**
 * 物料选择器组件类型定义
 */

import type { ISysMaterialView, ISysMaterialQuery } from '/@/views/supplychain/sysmaterial/api/interface';
import type { ISysMaterialSkuView, ISysMaterialSkuQuery, ISysMaterialSkuVm } from '/@/views/supplychain/sysmaterialsku/api/interface';
import type { ISysMaterialAttributeView } from '/@/views/supplychain/sysmaterialattribute/api/interface';

// Re-export for convenience
export type { ISysMaterialView, ISysMaterialAttributeView };

/**
 * 物料选择器 Props 接口
 */
export interface MaterialSelectorProps {
  /** v-model 绑定的值（SKU ID 或 IDs） */
  modelValue?: string | string[] | null;
  /** 输入框占位文本 */
  placeholder?: string;
  /** 是否禁用 */
  disabled?: boolean;
  /** 是否可清空 */
  clearable?: boolean;
  /** 是否多选模式 */
  multiple?: boolean;
  /** 弹窗宽度 */
  dialogWidth?: string;
  /** 显示标签格式，支持变量：{MaterialName}, {SkuName}, {SkuCode}, {BarCode} */
  labelFormat?: string;
  /** 只显示启用状态的物料和 SKU */
  onlyActive?: boolean;
  /** 额外的物料过滤条件 */
  materialFilters?: Partial<ISysMaterialQuery>;
  /** 额外的 SKU 过滤条件 */
  skuFilters?: Partial<ISysMaterialSkuQuery>;
}

/**
 * 物料选择器 Emits 接口
 */
export interface MaterialSelectorEmits {
  /**
   * v-model 更新事件
   * @param value - 选择的 SKU ID 或 IDs
   */
  (e: 'update:modelValue', value: string | string[] | null): void;

  /**
   * 选择变化事件
   * @param value - 选择的 SKU ID 或 IDs
   * @param skus - 选择的 SKU 详情（可以是 View 或 ViewModel，ViewModel 包含更完整的信息如 Material）
   */
  (e: 'change', value: string | string[] | null, skus: ISysMaterialSkuView | ISysMaterialSkuView[] | ISysMaterialSkuVm | null): void;

  /**
   * 物料选择事件
   * @param material - 选择的物料信息
   */
  (e: 'materialSelect', material: ISysMaterialView): void;

  /**
   * SKU 选择事件
   * @param sku - 选择的 SKU 信息（单选时为对象，多选时为数组，可以是 View 或 ViewModel）
   */
  (e: 'skuSelect', sku: ISysMaterialSkuView | ISysMaterialSkuView[] | ISysMaterialSkuVm): void;
}

/**
 * 视图类型
 */
export type ViewType = 'material' | 'sku';

/**
 * 分页配置
 */
export interface PaginationConfig {
  /** 当前页码 */
  currentPage: number;
  /** 每页条数 */
  pageSize: number;
  /** 总条数 */
  total: number;
}

/**
 * 物料选择器实例方法
 */
export interface MaterialSelectorInstance {
  /**
   * 打开选择器弹窗
   */
  open: () => void;

  /**
   * 关闭选择器弹窗
   */
  close: () => void;

  /**
   * 清空选择
   */
  clear: () => void;

  /**
   * 刷新物料列表
   */
  refreshMaterials: () => Promise<void>;

  /**
   * 刷新 SKU 列表
   */
  refreshSkus: () => Promise<void>;
}

/**
 * 扩展的 SKU 视图（包含物料名称）
 */
export interface ExtendedMaterialSkuView extends ISysMaterialSkuView {
  /** 物料名称 */
  MaterialName?: string;
}

/**
 * 物料选择器配置选项（用于全局配置）
 */
export interface MaterialSelectorOptions {
  /** 默认弹窗宽度 */
  defaultDialogWidth?: string;
  /** 默认每页条数 */
  defaultPageSize?: number;
  /** 默认标签格式 */
  defaultLabelFormat?: string;
  /** 是否默认只显示启用的 */
  defaultOnlyActive?: boolean;
}

/**
 * 格式化变量映射
 */
export const FormatVariables = {
  MATERIAL_NAME: '{MaterialName}',
  SKU_NAME: '{SkuName}',
  SKU_CODE: '{SkuCode}',
  BAR_CODE: '{BarCode}',
} as const;

/**
 * 常用标签格式预设
 */
export const LabelFormatPresets = {
  /** 默认格式：物料名称-SKU名称(SKU编码) */
  DEFAULT: '{MaterialName}-{SkuName}({SkuCode})',
  /** 简洁格式：SKU名称(SKU编码) */
  SIMPLE: '{SkuName}({SkuCode})',
  /** 详细格式：物料名称 - SKU名称 - SKU编码 - 条形码 */
  DETAILED: '{MaterialName} - {SkuName} - {SkuCode} - {BarCode}',
  /** 仅名称：SKU名称 */
  NAME_ONLY: '{SkuName}',
  /** 仅编码：SKU编码 */
  CODE_ONLY: '{SkuCode}',
} as const;

/**
 * 组件状态
 */
export interface MaterialSelectorState {
  /** 弹窗是否可见 */
  dialogVisible: boolean;
  /** 当前视图类型 */
  currentView: ViewType;
  /** 是否正在加载物料 */
  materialLoading: boolean;
  /** 是否正在加载 SKU */
  skuLoading: boolean;
  /** 物料列表 */
  materialList: ISysMaterialView[];
  /** SKU 列表 */
  skuList: ExtendedMaterialSkuView[];
  /** 选中的物料 */
  selectedMaterial: ISysMaterialView | null;
  /** 选中的 SKU 列表 */
  selectedSkus: ExtendedMaterialSkuView[];
  /** 物料搜索条件 */
  materialSearchData: ISysMaterialQuery;
  /** SKU 搜索条件 */
  skuSearchData: ISysMaterialSkuQuery;
  /** 物料分页配置 */
  materialPagination: PaginationConfig;
  /** SKU 分页配置 */
  skuPagination: PaginationConfig;
}

/**
 * 错误类型
 */
export enum MaterialSelectorErrorType {
  /** 加载物料失败 */
  LOAD_MATERIALS_ERROR = 'LOAD_MATERIALS_ERROR',
  /** 加载 SKU 失败 */
  LOAD_SKUS_ERROR = 'LOAD_SKUS_ERROR',
  /** 加载已选 SKU 详情失败 */
  LOAD_SELECTED_SKU_ERROR = 'LOAD_SELECTED_SKU_ERROR',
  /** 网络错误 */
  NETWORK_ERROR = 'NETWORK_ERROR',
  /** 未知错误 */
  UNKNOWN_ERROR = 'UNKNOWN_ERROR',
}

/**
 * 错误信息
 */
export interface MaterialSelectorError {
  /** 错误类型 */
  type: MaterialSelectorErrorType;
  /** 错误消息 */
  message: string;
  /** 原始错误对象 */
  originalError?: any;
}

